﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using DevComponents.DotNetBar;
using DevComponents.DotNetBar.Metro;
using ProductManagement.Ultilities;

namespace ProductManagement.Forms
{
    /// <summary>
    /// Form sửa thông tin sản phẩm
    /// </summary>
    public partial class EditForm : MetroForm
    {
        #region Các trường

        /// <summary>
        /// ID của sản phẩm muốn sửa thông tin
        /// </summary>
        private int _id;
        /// <summary>
        /// Đối tượng liên kết dữ liệu LinQ to SQL, để thao tác với cơ sở dữ liệu
        /// </summary>
        private ProductManagementClassesDataContext db = new ProductManagementClassesDataContext();
        /// <summary>
        /// Đối tượng kiểm tra tính hợp lệ của dữ liệu nhập vào
        /// </summary>
        private Validator validator = new Validator();
        /// <summary>
        /// MainForm đang chạy
        /// </summary>
        private MainForm _mainForm;

        #endregion

        #region Hàm khởi tạo

        public EditForm()
        {
            InitializeComponent();
        }

        /// <summary>
        /// Hàm khởi tạo có tham số
        /// </summary>
        /// <param name="id">ID sản phẩm muốn sửa</param>
        /// <param name="mainForm">MainForm gọi tới form này</param>
        public EditForm(int id, MainForm mainForm)
        {
            _id = id;
            _mainForm = mainForm;
            InitializeComponent();
        }

        #endregion

        #region Các phương thức khác

        /// <summary>
        /// Kiểm tra tính hợp lệ của dữ liệu nhập vào
        /// </summary>
        /// <returns>true nếu hợp lệ, false nếu không hợp lệ</returns>
        private bool ValidateEditData()
        {
            bool isValidName = validator.ValidateName(txtEditName, errorProvider1);
            bool isValidPrice = validator.ValidatePrice(txtEditPrice, errorProvider1);
            bool isValidQuantity = validator.ValidateQuantity(txtEditQuantity, errorProvider1);
            bool isValidYear = validator.ValidateYear(txtEditYear, errorProvider1);
            return (isValidName && isValidPrice && isValidQuantity && isValidYear);
        }

        /// <summary>
        /// Hiển thị thông tin sản phẩm muốn sửa trên form
        /// </summary>
        private void DisplayProductInfomation()
        {
            var product = db.sp_GetProductInfomation(_id).SingleOrDefault();
            txtEditName.Text = product.name;
            txtEditPrice.Text = product.price.ToString();
            txtEditQuantity.Text = product.quantity.ToString();
            txtEditYear.Text = product.year.ToString();
        }

        #endregion

        #region Xử lý sự kiện

        /// <summary>
        /// Sự kiện nhấn nút Sửa (sửa thông tin sản phẩm)
        /// </summary>
        private void btnEdit_Click(object sender, EventArgs e)
        {
            if (ValidateEditData())
            {
                //Hiển thị hộp thoại lựa chọn, lưu kết quả lựa chọn của người dùng vào biến dr
                DialogResult dr = MessageBoxEx.Show("Bạn có muốn sửa thông tin sản phẩm?", "Thông báo", MessageBoxButtons.YesNo, MessageBoxIcon.Question);
                //Nếu người dùng chọn Yes
                if (dr == DialogResult.Yes)
                {
                    string name = txtEditName.Text;
                    decimal price = Decimal.Parse(txtEditPrice.Text);
                    int quantity = Int32.Parse(txtEditQuantity.Text);
                    int year = Int32.Parse(txtEditYear.Text);
                    string state = (quantity > 0) ? "Còn hàng" : "Hết hàng";
                    //Sửa thông tin sản phẩm trong cơ sở dữ liệu
                    db.sp_UpdateProduct(_id, name, price, quantity, year, state);
                    db.SubmitChanges();
                    _mainForm.DisplayGeneralInfoAfterEdit();
                    MessageBoxEx.Show("Sửa thông tin sản phẩm thành công", "Thông báo", MessageBoxButtons.OK, MessageBoxIcon.Information);
                }
                errorProvider1.Dispose();
            }
        }

        /// <summary>
        /// Sự kiện nhấn nút Nhập lại (xóa các trường người dùng đã nhập)
        /// </summary>
        private void btnResetEdit_Click(object sender, EventArgs e)
        {
            DisplayProductInfomation();
        }

        /// <summary>
        /// Sự kiện nhấn nút OK (thoát form)
        /// </summary>
        private void btnOK_Click(object sender, EventArgs e)
        {
            this.Close();
        }

        /// <summary>
        /// Sự kiện load form
        /// </summary>
        private void EditForm_Load(object sender, EventArgs e)
        {
            DisplayProductInfomation();
        }

        #endregion
    }
}
